package edu.cgpi.core.entidade;

import java.util.HashSet;
import java.util.Set;

/**
 * Esta classe representa a estrutura de um 
 * circulo cujo algoritmo de obtenção , ou sejá, o algoritmo de 
 * obtenção dos pontos não utiliza da 
 * simetria para diminuir o esforço.
 */
public class CirculoOtimizado extends AbstractCirculo {
	
	public CirculoOtimizado(Ponto centro, Double raio) {
		super(centro, raio);
	}
	
	public CirculoOtimizado(Ponto centro, Ponto pontoDoCirculo) {
		super(centro, pontoDoCirculo);
	}

	/**
	 * Obtém os pontos deste Círculo. Esta implementação
	 * calcula 8 pontos por iteração do loop.
	 */
	public Set<Ponto> obterPontos() {
		Set<Ponto> pontos = new HashSet<Ponto>();
		for (double angulo = 0; angulo < 45; angulo = angulo + 0.25) {
			Double x = calcularX(angulo);
			Double y = calcularY(angulo);
			Ponto pontoInicial = new Ponto(x, y);
			pontos.add(pontoInicial);
			for (Ponto ponto : montarPontosSimetricos(pontoInicial)) {
				pontos.add(ponto);
			}
			Ponto pontoSimetricoAoInicialNoQuadrante = new Ponto(y - centro.getY() + centro.getX(), x - centro.getX() + centro.getY());
			pontos.add(pontoSimetricoAoInicialNoQuadrante);
			for (Ponto ponto : montarPontosSimetricos(pontoSimetricoAoInicialNoQuadrante)) {
				pontos.add(ponto);
			}
		}
		return pontos;
	}
	
	private Set<Ponto> montarPontosSimetricos(Ponto pontoQuadrante1) {
		Ponto pontoQuadrante2 = obterPontoQuadrante2(pontoQuadrante1);
		Ponto pontoQuadrante3 = obterPontoQuadrante3(pontoQuadrante2);
		Ponto pontoQuadrante4 = obterPontoQuadrante4(pontoQuadrante3);
		
		Set<Ponto> pontos = new HashSet<Ponto>();
		pontos.add(pontoQuadrante2);
		pontos.add(pontoQuadrante3);
		pontos.add(pontoQuadrante4);
		return pontos; 
	}
	
	private Ponto obterPontoQuadrante2(Ponto pontoQuadrante1) {
		Double x = pontoQuadrante1.getX() - 2 * (pontoQuadrante1.getX() - centro.getX());
		return new Ponto(x, pontoQuadrante1.getY());
	}
	
	private Ponto obterPontoQuadrante3(Ponto pontoQuadrante2) {
		Double y = pontoQuadrante2.getY() - 2 * (pontoQuadrante2.getY() - centro.getY());
		return new Ponto(pontoQuadrante2.getX(), y);
	}
	
	private Ponto obterPontoQuadrante4(Ponto pontoQuadrante3) {
		Double x = pontoQuadrante3.getX() + 2 * (centro.getX() - pontoQuadrante3.getX());
		return new Ponto(x, pontoQuadrante3.getY());
	}

	@Override
	public Double calcularDistancia(FormaGeometrica forma) {
		// TODO Auto-generated method stub
		return null;
	}
}